package com.matrix.media.entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.matrix.media.entity.Effect.Effect;
import lombok.Data;

import java.util.List;

/**
 * 视频轨素材VideoTrackClip的范围包括视频素材和图片素材。
 *
 * In、Out、TimelineIn、TimelineOut标记了对素材截取的位置以及素材在时间线中的位置，
 * 如：想把一段视频的5~10s放在时间线15s~20s位置上，则：In=5, Out=10, TimelineIn=15, TimelineOut=20。
 */
@Data
public class VideoTrackClip {

    //视频轨素材片段对应的IMS内容库媒资ID，或VOD媒资ID。
    //
    //注：MediaId和MediaURL有且仅有一个不为空
    private String MediaId;


    //视频轨素材片段对应的OSS地址，格式为：
    //
    //https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-object.mp4
    //
    //注：
    //
    //MediaId和MediaURL有且仅有一个不为空。
    //
    //MediaURL 仅支持OSS外网地址，不支持oss加速地址、cdn地址或其他http url。
    @JSONField(name = "MediaURL")
    private String MediaURL;


    //素材片段类型，默认Video。
    //
    //取值：
    //
    //Video（视频）
    //
    //Image（图片）
    //
    //GlobalImage（全局图片，默认按照最长视频轨时间计算该图片时长。视频轨道中使用全局图片GlobalImage）
    @JSONField(name = "Type")
    private String Type;

    //表示图片或视频左上角距离输出视频左上角的横向距离。注：支持百分比和像素两种形式。当取值为[0～0.9999]时，表示相对输出视频宽的占比。当取值为>=2的整数时，表示绝对像素。
    private Float X;

    //表示图片或视频左上角距离输出视频左上角的纵向距离。注：支持百分比和像素两种形式。当取值为[0～0.9999]时，表示相对输出视频高的占比。当取值为>=2的整数时，表示绝对像素。
    private Float y;

    //表示图片在输出视频中的宽度。注：支持百分比和像素两种形式。当取值为[0～0.9999]时，表示相对输出视频宽的占比。当取值为>=2的整数时，表示绝对像素。
    private Float Width;

    //表示图片在输出视频中的高度。注：支持百分比和像素两种形式。当取值为[0～0.9999]时，表示相对输出视频宽的占比。当取值为>=2的整数时，表示绝对像素。
    private Float Height;


    /*
    视频尺寸自适应模式类型，默认为Fill，必须同时设置视频轨道Width和Height，该模式才会生效，此时Width和Height为目标区域宽高，视频会在目标区域内自适应缩放。
    Contain：被替换的内容将被缩放，在填充目标区域的同时保留其长宽比。
    Cover：被替换的内容在保持其宽高比的同时填充整个目标区域。如果对象的宽高比与内容框不相匹配，该对象将被剪裁以适应目标区域。
    Fill：默认逻辑，被替换的内容正好填充目标内容框。整个对象将完全填充此框。如果对象的宽高比与内容框不相匹配，那么该对象将被拉伸以适应目标区域。
     */
    private String AdaptMode;

    //素材片段相对于素材的入点，在素材类型是音视频时使用。单位：秒，精确到小数点后4位。如果In不填，默认为0。
    private Float In;

    //素材片段相对于素材的出点，在素材类型是音视频时使用。单位：秒，精确到小数点后4位。如果Out不填，默认为素材时长。
    private Float Out;

    /*
      素材片段相对于素材的最大出点值。如果设置该值，素材片段相对于素材的出点将会设置为素材时长与该值中的较小者。
      在素材为音视频时使用。单位：秒，精确到小数点后4位。如果填入Out值，MaxOut值将失效。示例：视频轨中设置MaxOut。
      https://help.aliyun.com/document_detail/198744.html#p-n88-cl2-vt0
     */
    private Float MaxOut;

    //素材片段的时长，一般在素材类型是图片时使用。单位：秒，精确到小数点后4位。
    private Float Duration;

    //动图的帧数，在素材类型是图片且为动图时使用。示例：使用gif贴纸。
    //https://help.aliyun.com/document_detail/198744.html#section-ffs-6x1-iv5
    private Float DyncFrames;

    //素材片段相对于时间线的入点。单位：秒，精确到小数点后4位。如果TimelineIn不填，则会按照素材片段顺序相接的方式自动计算TimelineIn。
    private Float TimelineIn;

    //素材片段相对于时间线的出点。单位：秒，精确到小数点后4位。如果TimelineOut不填，则会按照素材片段顺序相接的方式自动计算TimelineOut。
    private Float TimelineOut;

    //视频素材速率，取值范围0.1~100，如：Speed=2，则将视频做2倍速处理，Clip的Duration减半，并合成到成片中。
    //https://help.aliyun.com/document_detail/198744.html#section-40t-rpf-j7x
    private Float Speed;

    //遮罩视频地址。一般为带 Alpha 通道的视频，用于为原视频添加透明通道效果。
    //
    //仅支持传入 OSS 外网地址
    private String MaskVideoUrl;

    //轨道对齐参数。其他音视频轨道的素材如果设置了相同的ReferenceClipId，则其时间线入出点与当前clip对齐。
    //https://help.aliyun.com/document_detail/2507542.html
    private String ClipId;

    //轨道对齐参数。其他音视频轨道的素材如果设置了相同的ClipId，则当前clip的时间线入出点与其他轨道的素材对齐。
    //https://help.aliyun.com/document_detail/2507542.html
    private String ReferenceClipId;

    //素材片段的效果列表。
    List<Effect> Effects;
}
